//============================================================================================
/**
 * @file	ld_lugia.c
 * @brief	伝説デモ画面・ルギア処理
 * @author	Hiroyuki Nakamura
 * @date	09.01.21
 */
//============================================================================================
#include "common.h"

#include "system/wipe.h"
#include "system/arc_util.h"
#include "system/snd_tool.h"
//#include "poketool/monsno.h"

#include "../../../src/field/fieldsys.h"

#include "ld_main.h"
#include "ld_lugia.h"
#include "ld_lugia_snd_def.h"
#include "ld_lugia.naix"


//============================================================================================
//	定数定義
//============================================================================================
#define	MOTION_BL_OFF

// メインシーケンス
enum {
	MAINSEQ_INIT = 0,		// 初期化
	MAINSEQ_RELEASE,		// 解放
	MAINSEQ_FADE,			// フェード

	MAINSEQ_MAIN,			// メイン

#ifdef	PM_DEBUG
	MAINSEQ_DEBUG_MAIN,		// デバッグ用メイン
#endif	// PM_DEBUG

	MAINSEQ_END,			// 終了
};

// シーンデータ定義
enum {
	LUGIA_SCENE_01 = 0,
	LUGIA_SCENE_02,
	LUGIA_SCENE_MAX,
};


//============================================================================================
//	プロトタイプ宣言
//============================================================================================
static int MainSeq_Init( LEGEND_DEMO_WORK * wk );
static int MainSeq_Release( LEGEND_DEMO_WORK * wk );
static int MainSeq_Fade( LEGEND_DEMO_WORK * wk );
static int MainSeq_Main( LEGEND_DEMO_WORK * wk );

#ifdef	PM_DEBUG
static int MainSeq_DebugMain( LEGEND_DEMO_WORK * wk );
#endif	// PM_DEBUG


//============================================================================================
//	グローバル変数
//============================================================================================

// メインシーケンス
static const pLegendDemoFunc MainSeq[] = {
	MainSeq_Init,
	MainSeq_Release,
	MainSeq_Fade,

	MainSeq_Main,

#ifdef	PM_DEBUG
	MainSeq_DebugMain,
#endif	// PM_DEBUG
};

// シーンリソースデータ
static const LD_RES_TBL LugiaResTbl[] =
{
	{
		NARC_ld_lugia_demoapri_r_lz_nsbmd,
		{
			NARC_ld_lugia_demoapri_r_lz_nsbca, NARC_ld_lugia_demoapri_r_lz_nsbma,
			NARC_ld_lugia_demoapri_r_lz_nsbta, NARC_ld_lugia_demoapri_r_lz_nsbtp
		},
		FALSE
	},
	{
		NARC_ld_lugia_lugia_b09_lz_nsbmd,
		{ NARC_ld_lugia_lugia_b09_lz_nsbca, LD_RES_DUMMY, LD_RES_DUMMY, LD_RES_DUMMY },
		TRUE
	},
};


// カメラ設定
static const LD_CAMERA_DATA CameraData =
{
	{
		0x153b51,							// 距離
		{ 0x982, 0x1e20, 0x0 },				// アングル
		GF_CAMERA_PERSPECTIV,				// 射影
		0xa01,								// パース
		0,									// dummy
	},
	{ 0x4dec, 0x803cd, 0x2b2f5 },			// 注視点
	123 * FX32_ONE,							// near
	1700 * FX32_ONE							// far
};

// エッジマーキングカラー
static const GXRgb EdgeColor[8] = {
    GX_RGB(0,0,0),
    GX_RGB(9,20,30),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4)
};


//--------------------------------------------------------------------------------------------
/**
 * ルギアデモ：メイン処理
 *
 * @param	wk		伝説デモワーク
 *
 * @retval	"1 = 処理中"
 * @retval	"0 = それ以外"
 */
//--------------------------------------------------------------------------------------------
int LDLUGIA_Main( LEGEND_DEMO_WORK * wk )
{
	wk->main_seq = MainSeq[wk->main_seq]( wk );

	if( wk->main_seq == MAINSEQ_END ){
		return 0;
	}

	LDMAIN_Draw3DMain( wk );

	return 1;
}


//============================================================================================
//	メインシーケンス
//============================================================================================

#define ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EVA	( 5 )	// モーションブラー係数　新しくブレンドされる絵
#define ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EAB	( 13 )	// モーションブラー係数　すでにバッファされている絵

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：初期化
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Init( LEGEND_DEMO_WORK * wk )
{
	LDMAIN_CommInit( wk );

	LDMAIN_InitCamera( wk, &CameraData );
	LDMAIN_SetLight( &wk->dat->glst );
	LDMAIN_EdgeMarkingSet( EdgeColor );
	LDMAIN_Load3DData( wk, ARC_LD_LUGIA, LugiaResTbl, LUGIA_SCENE_MAX );

#ifndef	MOTION_BL_OFF
	wk->mb = LDMAIN_MotionBlInit(
				ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EVA, ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EAB );
#endif	// MOTION_BL_OFF


#ifdef	PM_DEBUG
	if( wk->dat->debug == 1 ){
		LDMAIN_FadeInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_DEBUG_MAIN );
	}else{
		LDMAIN_FadeInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_MAIN );
	}
#else
	LDMAIN_FadeInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_MAIN );
#endif	// PM_DEBUG


	return MAINSEQ_FADE;
}

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：解放
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Release( LEGEND_DEMO_WORK * wk )
{
#ifndef	MOTION_BL_OFF
	LDMAIN_MotionBlExit( wk->mb );
#endif	// MOTION_BL_OFF

	LDMAIN_Delete3DData( wk );

	LDMAIN_CommRelease( wk );

	return MAINSEQ_END;
}

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：フェード
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Fade( LEGEND_DEMO_WORK * wk )
{
	if( WIPE_SYS_EndCheck() == TRUE ){
		return wk->next_seq;
	}
	return MAINSEQ_FADE;
}


#define	FADE_OUT_DIV		( WIPE_DEF_DIV )	// フェード分割数
#define	FADE_OUT_SYNC		( WIPE_DEF_SYNC )	// フェードフレーム数

#define	DEMO_CNT_MAX				( 238 )		// 総フレーム数
#define	DEMO_CNT_SE_PLAY_TAKI		( 0 )		// 滝ＳＥ再生フレーム
#define	DEMO_CNT_SE_PLAY_APPEARANCE	( 115 )		// 登場ＳＥ再生フレーム
#define	DEMO_CNT_VOICE_PLAY			( 145 )		// 鳴き声再生フレーム
#define	DEMO_CNT_FADE_OUT			( DEMO_CNT_MAX - FADE_OUT_DIV * FADE_OUT_SYNC )		// フェードアウト開始フレーム

#define	TAKI_SE_VOL_MIN			( 0 )		// 滝ＳＥボリューム最小値
#define	TAKI_SE_VOL_MAX			( 30 )		// 滝ＳＥボリューム最大値
#define	TAKI_SE_VOL_FRAME		( 10 )		// 滝ＳＥボリューム変更開始フレーム
#define	TAKI_SE_VOL_END_FRAME	( TAKI_SE_VOL_FRAME + DEMO_CNT_SE_PLAY_TAKI )		// 滝ＳＥボリューム変更終了フレーム
// 滝ＳＥボリューム変更計算
#define	TAKI_SE_VOL_CALC(a)		( (((TAKI_SE_VOL_MAX-TAKI_SE_VOL_MIN)<<8) / TAKI_SE_VOL_FRAME * (a-DEMO_CNT_SE_PLAY_TAKI))>>8 )


#ifdef PM_DEBUG
static u32	testCnt = 0;
#endif

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：メイン処理
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Main( LEGEND_DEMO_WORK * wk )
{
	if( LDMAIN_AllObjAnmCheck( wk ) == FALSE &&
		WIPE_SYS_EndCheck() == TRUE ){
//		OS_Printf( "cnt = %d\n", wk->cnt );
		wk->cnt = 0;
		Snd_SeStopBySeqNo( SE_LD_LUGIA_TAKI, 0 );
		LDMAIN_MotionBlExit( wk->mb );
//		LDMAIN_FadeOutSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_RELEASE );
//		return MAINSEQ_FADE;
		return MAINSEQ_RELEASE;
	}

#ifdef PM_DEBUG
	if( sys.trg & PAD_BUTTON_A ){
		OS_Printf( "testCnt[%d] = %d\n", testCnt, wk->cnt );
		testCnt++;
	}
#endif


	if( wk->cnt == DEMO_CNT_SE_PLAY_TAKI ){
//		Snd_SePlay( SE_LD_LUGIA_TAKI );
		Snd_SePlayVol( SE_LD_LUGIA_TAKI, TAKI_SE_VOL_MIN );
	}else if( wk->cnt == DEMO_CNT_SE_PLAY_APPEARANCE ){
		Snd_SePlay( SE_LD_LUGIA_APPEARANCE );
	}else if( wk->cnt == DEMO_CNT_VOICE_PLAY ){
		Snd_PMVoicePlay( MONSNO_RUGIA, 0 );
		wk->mb = LDMAIN_MotionBlInit(
				ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EVA, ENCOUNT_LEGEND_PACKAGE_MOTIONBL_EAB );
	}else if( wk->cnt == DEMO_CNT_FADE_OUT ){
		LDMAIN_FadeOutSet( wk, FADE_OUT_DIV, FADE_OUT_SYNC, MAINSEQ_RELEASE );
	}

	// 滝ＳＥのボリューム変更
	if( wk->cnt > DEMO_CNT_SE_PLAY_TAKI ){
		if( wk->cnt == TAKI_SE_VOL_END_FRAME ){
			Snd_PlayerSetInitialVolumeBySeqNo( SE_LD_LUGIA_TAKI, TAKI_SE_VOL_MAX );
		}else if( wk->cnt < TAKI_SE_VOL_END_FRAME ){
			Snd_PlayerSetInitialVolumeBySeqNo( SE_LD_LUGIA_TAKI, TAKI_SE_VOL_MIN+TAKI_SE_VOL_CALC(wk->cnt) );
		}
	}

	wk->cnt++;

	return MAINSEQ_MAIN;
}















//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//	デバッグ処理
//============================================================================================
#ifdef	PM_DEBUG
// メインシーケンス：デバッグメイン
static int MainSeq_DebugMain( LEGEND_DEMO_WORK * wk )
{
	if( LDMAIN_DebugMainControl( wk ) == FALSE ){
		LDMAIN_FadeOutSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_RELEASE );
		return MAINSEQ_FADE;
	}

	return MAINSEQ_DEBUG_MAIN;
}
#endif	// PM_DEBUG